// goroutine调度模型

// GMP
// G G是Goroutine的缩写，相当于操作系统中的进程控制块，在这里就是Goroutine的控制结构，是对Goroutine的抽象。其中包括执行的函数指令及参数；G保存的任务对象；线程上下文切换，现场保护和现场恢复需要的寄存器(SP、IP)等信息。
// M M是一个线程或称为Machine，所有M是有线程栈的。
// P P(Processor)是一个抽象的概念，并不是真正的物理CPU。所以当P有任务时需要创建或者唤醒一个系统线程来执行它队列里的任务。所以P/M需要进行绑定，构成一个执行单元。

// M:N:把m个goroutine分配给n个操作系统线程去执行.

// goroutine初始栈的大小是2k.

package main

import (
	"fmt"
	"time"
)

func hello() {
	for i := 0; i < 100; i++ {
		fmt.Printf("%d\n", i)
	}

}

func main() {
	go hello() // 开启一个单独的goroutine去执行hello函数（任务）
	fmt.Println("test")
	time.Sleep(time.Second)
}
